﻿using System.Collections.Generic;
using System.Linq;
using GigaSite.Domain.Enums;

namespace GigaSite.Domain.Entities
{
    /// <summary>
    /// Объект представляющий категорию системы
    /// </summary>
    public partial class Category
    {
        /// <summary>
        /// Получает список всех дочерних категорий
        /// </summary>
        /// <param name="outputList">Список куда их поместить</param>
        public void GetAllChildCategories(ref IList<Category> outputList)
        {
            foreach(var category in this.ChildCategories)
            {
                outputList.Add(category);
                category.GetAllChildCategories(ref outputList);
            }
        }

        /// <summary>
        /// Возвращает список всех родительских категорий данной категории
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Category> GetParentCategories()
        {
            var list = new List<Category>();
            Category currentCategory = this.ParentCategory;
            while (currentCategory != null)
            {
                list.Insert(0,currentCategory);
                currentCategory = currentCategory.ParentCategory;
            }
            return list;
        }

        /// <summary>
        /// Возвращает количество визиток в текущей категории
        /// </summary>
        /// <returns>количество только активных визиток</returns>
        public int GetBusinessCardsCount()
        {
            return this.BusinessCardToCategoryMappings.Count(m => m.BusinessCard.Status == BusinessCardStatuses.Active);
        }

        /// <summary>
        /// Имеет ли категория дочерние категории
        /// </summary>
        public bool HasChildCategories
        {
            get { return this.ChildCategories.Count > 0; }
        }

        /// <summary>
        /// Количество дочерних категорий у подкатегории
        /// </summary>
        public int ChildCategoriesCount
        {
            get { return this.ChildCategories.Count; }
        }

        /// <remarks>
        /// Создает копию списка категорий
        /// </remarks>
        /// <summary>
        /// Получает коллекцию дочерних категорий текущей категории как список
        /// </summary>
        /// <returns></returns>
        public IList<Category> GetChildCategories()
        {
            return this.ChildCategories.ToList();
        }
    }
}